Newer
Older
TheVengeance-Project-IADE-Unity2D / Assets / 2D Customizable Characters / Characters / Male / Scripts / CharacterSetup.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[ExecuteInEditMode]
public class CharacterSetup : MonoBehaviour {
	[Header("Direction Game Objects")]
    public GameObject downDirection;
    public GameObject upDirection;
    public GameObject leftDirection;
    public GameObject rightDirection;
	[Header("Weapons")]
	public Sprite swingWeapon;
	public Sprite thrustWeapon;
	public Sprite bowWeapon;
	[Header("Base")]
    public Color skinColor;
	public Sprite eyeShape;
    public Color eyeColor;
	[Header("Hair")]
	public Sprite hair;
    public Sprite facialHair;
	public Sprite eyebrowShape;
	public Color hairColor;
	[Header("Headwear")]
    public Sprite headwear;
    public Color headwearColor;
	[Header("Shoulders")]
	public Sprite leftShoulder;
	public Color leftShoulderColor;
	[Space(5)] 
	public Sprite rightShoulder;
	public Color rightShoulderColor;
	[Header("Left Arm")]
    public Sprite leftUpperArmEquipment;
    public Color leftUpperArmEquipmentColor;
	[Space(5)] 
	public Sprite leftLowerArmEquipment;
	public Color leftLowerArmEquipmentColor;
	[Space(5)] 
	public Sprite leftHandEquipment;
	public Color leftHandEquipmentColor;
	[Header("Right Arm")]
	public Sprite rightUpperArmEquipment;
	public Color rightUpperArmEquipmentColor;
	[Space(5)] 
	public Sprite rightLowerArmEquipment;
	public Color rightLowerArmEquipmentColor;
	[Space(5)] 
	public Sprite rightHandEquipment;
	public Color rightHandEquipmentColor;
	[Header("Upper Body")]
    public Sprite chestEquipment;
    public Color chestEquipmentColor;
	[Space(5)] 
    public Sprite bodyEquipment;
    public Color bodyEquipmentColor;
	[Space(5)] 
    public Sprite belt;
    public Color beltColor;
	[Space(5)] 
	public Sprite hipEquipment;
	public Color hipEquipmentColor;
	[Header("Left Leg")]
	public Sprite leftUpperLegEquipment;
	public Color leftUpperLegEquipmentColor;
	[Space(5)] 
	public Sprite leftLowerLegEquipment;
	public Color leftLowerLegEquipmentColor;
	[Space(5)] 
	public Sprite leftFootEquipment;
	public Color leftFootEquipmentColor;
	[Header("Right Leg")]
    public Sprite rightUpperLegEquipment;
    public Color rightUpperLegEquipmentColor;
	[Space(5)] 
    public Sprite rightLowerLegEquipment;
    public Color rightLowerLegEquipmentColor;
	[Space(5)] 
    public Sprite rightFootEquipment;
    public Color rightFootEquipmentColor;

    private GameObject previousDownDirection;

    private SpriteRenderer[] cachedUpSpriteRenderers = null;
    private SpriteRenderer[] cachedLeftSpriteRenderers = null;
    private SpriteRenderer[] cachedDownSpriteRenderers = null;
    private SpriteRenderer[] cachedRightSpriteRenderers = null;

    void Awake()
    {
        if (downDirection != null)
        {
            UpdateCachedSpriteRenderers(downDirection, ref cachedDownSpriteRenderers);

            if (cachedDownSpriteRenderers != null && cachedDownSpriteRenderers.Length > 0)
            {
				swingWeapon = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__swing weapon slot").sprite;
				thrustWeapon = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__thrust weapon slot").sprite;
				bowWeapon = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__bow weapon slot").sprite;

                skinColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "head").color;
				eyeShape = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "eyes").sprite;
                eyebrowShape = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "eyebrows").sprite;
                eyeColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "eye color").color;

                hairColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__hair slot").color;
                hair = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__hair slot").sprite;
                facialHair = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__facial hair slot").sprite;

                headwear = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__headwear slot").sprite;
                headwearColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__headwear slot").color;

                rightShoulder = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__right shoulder slot").sprite;
                rightShoulderColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__right shoulder slot").color;
                rightUpperArmEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__right upper arm slot").sprite;
                rightUpperArmEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__right upper arm slot").color;
				rightLowerArmEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__right lower arm slot").sprite;
				rightLowerArmEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__right lower arm slot").color;
				rightHandEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__right hand slot").sprite;
				rightHandEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__right hand slot").color;

                leftShoulder = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__left shoulder slot").sprite;
                leftShoulderColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__left shoulder slot").color;
                leftUpperArmEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__left upper arm slot").sprite;
                leftUpperArmEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__left upper arm slot").color;
				leftLowerArmEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__left lower arm slot").sprite;
				leftLowerArmEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__left lower arm slot").color;
				leftHandEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__left hand slot").sprite;
				leftHandEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__left hand slot").color;

                chestEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__chest slot").sprite;
                chestEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__chest slot").color;
                bodyEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__body slot").sprite;
                bodyEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__body slot").color;
				belt = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__belt slot").sprite;
				beltColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__belt slot").color;
                hipEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__hip slot").sprite;
                hipEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__hip slot").color;

                rightUpperLegEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__right upper leg slot").sprite;
                rightUpperLegEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__right upper leg slot").color;
                rightLowerLegEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__right lower leg slot").sprite;
                rightLowerLegEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__right lower leg slot").color;
                rightFootEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__right foot slot").sprite;
                rightFootEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__right foot slot").color;			
                
				leftUpperLegEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__left upper leg slot").sprite;
                leftUpperLegEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__left upper leg slot").color;	
                leftLowerLegEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__left lower leg slot").sprite;
                leftLowerLegEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__left lower leg slot").color;
                leftFootEquipment = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__left foot slot").sprite;
                leftFootEquipmentColor = GetSpriteRendererBySlotName(cachedDownSpriteRenderers, "__left foot slot").color;
            }
        }
    }

    void Update()
    {
        if (!Application.isPlaying)
        {
            if (downDirection != previousDownDirection)
            {
                Awake();
                previousDownDirection = downDirection;
            }
            UpdateSprites(true);
        }
    }

    public void UpdateSprites(bool updateColorOnly)
    {
        UpdateCachedSpriteRenderersForAllDirections();

        UpdateSpritesForDirection(cachedDownSpriteRenderers, "down", updateColorOnly);
        UpdateSpritesForDirection(cachedUpSpriteRenderers, "up", updateColorOnly);        
        if (rightDirection != leftDirection && rightDirection != null)
        {
			UpdateSpritesForDirection(cachedLeftSpriteRenderers, "side", updateColorOnly);
			UpdateSpritesForDirection(cachedRightSpriteRenderers, "side", updateColorOnly);
        }
        else
        {
            UpdateSpritesForDirection(cachedLeftSpriteRenderers, "side", updateColorOnly);
        }
    }

    private void UpdateCachedSpriteRenderersForAllDirections()
    {
        UpdateCachedSpriteRenderers(downDirection, ref cachedDownSpriteRenderers);
        UpdateCachedSpriteRenderers(upDirection, ref cachedUpSpriteRenderers);
        UpdateCachedSpriteRenderers(leftDirection, ref cachedLeftSpriteRenderers);
        if (rightDirection != leftDirection)
        {
            UpdateCachedSpriteRenderers(rightDirection, ref cachedRightSpriteRenderers);
        }
    }

    private void UpdateCachedSpriteRenderers(GameObject directionGameObject, ref SpriteRenderer[] cachedSpriteRenderers)
    {
        if (directionGameObject != null)
        {
            if (cachedSpriteRenderers == null || cachedSpriteRenderers.Length == 0)
            {
                cachedSpriteRenderers = directionGameObject.GetComponentsInChildren<SpriteRenderer>(true);
            }
        }
    }

    private void UpdateSpritesForDirection(SpriteRenderer[] cachedSpriteRenderers, string direction, bool updateColorOnly)
    {
        if (cachedSpriteRenderers != null && cachedSpriteRenderers.Length > 0)
        {
            bool isMainDirection = direction == "down";
            bool updateSprites = isMainDirection || !updateColorOnly;

			//weapons
			SpriteRenderer swingWeaponSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__swing weapon slot");
			UpdateSprite(swingWeaponSlotSR, swingWeapon, swingWeaponSlotSR.color, direction, isMainDirection, updateSprites);
			SpriteRenderer thrustWeaponSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__thrust weapon slot");
			UpdateSprite(thrustWeaponSlotSR, thrustWeapon, thrustWeaponSlotSR.color, direction, isMainDirection, updateSprites);
			SpriteRenderer bowWeaponSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__bow weapon slot");
			UpdateSprite(bowWeaponSlotSR, bowWeapon, bowWeaponSlotSR.color, direction, isMainDirection, updateSprites);

			//face
            SpriteRenderer headSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "head");
            headSR.color = skinColor;

			SpriteRenderer eyesClosedSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "eyes closed");
			eyesClosedSR.color = new Color (skinColor.r, skinColor.g, skinColor.b, eyesClosedSR.color.a);

            SpriteRenderer eyebrowShapeSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "eyebrows");
			UpdateSprite(eyebrowShapeSR, eyebrowShape, hairColor, direction, isMainDirection, updateSprites);

            SpriteRenderer eyesSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "eye color");
		    eyesSR.color = eyeColor;

			SpriteRenderer eyeshapeSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "eyes");
			UpdateSprite(eyeshapeSR, eyeShape, Color.white, direction, isMainDirection, updateSprites);

            //hair and headwear
            SpriteRenderer hairSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__hair slot");
            UpdateSprite(hairSlotSR, hair, hairColor, direction, isMainDirection, updateSprites);

            SpriteRenderer facialHairSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__facial hair slot");
            UpdateSprite(facialHairSlotSR, facialHair, hairColor, direction, isMainDirection, updateSprites);

            SpriteRenderer headwearSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__headwear slot");
            UpdateSprite(headwearSlotSR, headwear, headwearColor, direction, isMainDirection, updateSprites);

            //right arm
            SpriteRenderer rightShoulderSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__right shoulder slot");
            UpdateSprite(rightShoulderSlotSR, rightShoulder, rightShoulderColor, direction, isMainDirection, updateSprites);

            SpriteRenderer rightUpperArmSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__right upper arm slot");
            UpdateSprite(rightUpperArmSlotSR, rightUpperArmEquipment, rightUpperArmEquipmentColor, direction, isMainDirection, updateSprites);

			SpriteRenderer rightLowerArmSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__right lower arm slot");
			UpdateSprite(rightLowerArmSlotSR, rightLowerArmEquipment, rightLowerArmEquipmentColor, direction, isMainDirection, updateSprites);

			SpriteRenderer rightHandSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__right hand slot");
			UpdateSprite(rightHandSlotSR, rightHandEquipment, rightHandEquipmentColor, direction, isMainDirection, updateSprites);

            SpriteRenderer rightUpperArmSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "right upper arm");
			rightUpperArmSR.color = skinColor;
		
            SpriteRenderer rightLowerArmSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "right lower arm");
			rightLowerArmSR.color = skinColor;
	
			SpriteRenderer rightHandSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "right hand");
			rightHandSR.color = skinColor;

            //left arm
            SpriteRenderer leftShoulderSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__left shoulder slot");
            UpdateSprite(leftShoulderSlotSR, leftShoulder, leftShoulderColor, direction, isMainDirection, updateSprites);

            SpriteRenderer leftUpperArmSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__left upper arm slot");
            UpdateSprite(leftUpperArmSlotSR, leftUpperArmEquipment, leftUpperArmEquipmentColor, direction, isMainDirection, updateSprites);

			SpriteRenderer leftLowerArmSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__left lower arm slot");
			UpdateSprite(leftLowerArmSlotSR, leftLowerArmEquipment, leftLowerArmEquipmentColor, direction, isMainDirection, updateSprites);

			SpriteRenderer leftHandSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__left hand slot");
			UpdateSprite (leftHandSlotSR, leftHandEquipment, leftHandEquipmentColor, direction, isMainDirection, updateSprites);

         	SpriteRenderer leftUpperArmSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "left upper arm");
			leftUpperArmSR.color = skinColor;
		
			SpriteRenderer leftLowerArmSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "left lower arm");
			leftLowerArmSR.color = skinColor;
		
			SpriteRenderer leftHandSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "left hand");
			leftHandSR.color = skinColor;

            //chest
            SpriteRenderer chestSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "chest");
			chestSR.color = skinColor;
 
            SpriteRenderer chestSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__chest slot");
            UpdateSprite(chestSlotSR, chestEquipment, chestEquipmentColor, direction, isMainDirection, updateSprites);

            //body
            SpriteRenderer bodySR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "body");
			bodySR.color = skinColor;

            SpriteRenderer bodySlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__body slot");
            UpdateSprite(bodySlotSR, bodyEquipment, bodyEquipmentColor, direction, isMainDirection, updateSprites);

			SpriteRenderer beltSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__belt slot");
            UpdateSprite(beltSlotSR, belt, beltColor, direction, isMainDirection, updateSprites);

			SpriteRenderer hipSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__hip slot");
			UpdateSprite(hipSlotSR, hipEquipment, hipEquipmentColor, direction, isMainDirection, updateSprites);

            //right leg
            SpriteRenderer rightUpperLegSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "right upper leg");
			rightUpperLegSR.color = skinColor;

            SpriteRenderer rightUpperLegSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__right upper leg slot");
            UpdateSprite(rightUpperLegSlotSR, rightUpperLegEquipment, rightUpperLegEquipmentColor, direction, isMainDirection, updateSprites);

            SpriteRenderer rightLowerLegSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "right lower leg");
			rightLowerLegSR.color = skinColor;
   
            SpriteRenderer rightLowerLegSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__right lower leg slot");
            UpdateSprite(rightLowerLegSlotSR, rightLowerLegEquipment, rightLowerLegEquipmentColor, direction, isMainDirection, updateSprites);

            SpriteRenderer rightFootSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "right foot");
			rightFootSR.color = skinColor;

            SpriteRenderer rightFootSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__right foot slot");
            UpdateSprite(rightFootSlotSR, rightFootEquipment, rightFootEquipmentColor, direction, isMainDirection, updateSprites);

            //left leg
            SpriteRenderer leftUpperLegSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "left upper leg");
			leftUpperLegSR.color = skinColor;

            SpriteRenderer leftUpperLegSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__left upper leg slot");
            UpdateSprite(leftUpperLegSlotSR, leftUpperLegEquipment, leftUpperLegEquipmentColor, direction, isMainDirection, updateSprites);

            SpriteRenderer leftLowerLegSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "left lower leg");
			leftLowerLegSR.color = skinColor;

            SpriteRenderer leftLowerLegSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__left lower leg slot");
            UpdateSprite(leftLowerLegSlotSR, leftLowerLegEquipment, leftLowerLegEquipmentColor, direction, isMainDirection, updateSprites);

            SpriteRenderer leftFootSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "left foot");
			leftFootSR.color = skinColor;

            SpriteRenderer leftFootSlotSR = GetSpriteRendererBySlotName(cachedSpriteRenderers, "__left foot slot");
            UpdateSprite(leftFootSlotSR, leftFootEquipment, leftFootEquipmentColor, direction, isMainDirection, updateSprites);
        }
    }

    private void UpdateSprite(SpriteRenderer spriteRenderer, Sprite sprite, Color color, string direction, bool isMainDirection, bool updateSprite)
    {
#if UNITY_EDITOR
        if (spriteRenderer != null)
        {
            spriteRenderer.color = color;

            if (updateSprite)
            {
                if (isMainDirection)
                {
                    spriteRenderer.sprite = sprite;
                }
                else
                {
                    if (sprite != null)
                    {
                        string spriteName = sprite.name;
                        spriteName = spriteName.Replace("down", direction);
                        spriteName = spriteName.Replace("Down", direction.Substring(0,1).ToUpper() + direction.Substring(1, direction.Length - 1));
                        string[] assets = UnityEditor.AssetDatabase.FindAssets(spriteName);
                        for (int i = 0; i < assets.Length; i++)
                        {
                            string path = UnityEditor.AssetDatabase.GUIDToAssetPath(assets[0]);
                            if (UnityEditor.AssetDatabase.GetMainAssetTypeAtPath(path) == typeof(Sprite))
                            {
                                Sprite loadedSprite = UnityEditor.AssetDatabase.LoadAssetAtPath<Sprite>(path);
                                spriteRenderer.sprite = sprite;
                                break;
                            }
                            else if (UnityEditor.AssetDatabase.GetMainAssetTypeAtPath(path) == typeof(Texture2D))
                            {
                                bool set = false;
                                Object[] spriteArray = UnityEditor.AssetDatabase.LoadAllAssetsAtPath(path);
                                for (int j = 0; j < spriteArray.Length; j++)
                                {
                                    if (spriteArray[j].GetType() == typeof(Sprite) && spriteArray[j].name == spriteName)
                                    {
                                        spriteRenderer.sprite = spriteArray[j] as Sprite;
                                        set = true;
                                        break;
                                    }
                                }
                                if (set)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
#endif
    }

    private SpriteRenderer GetSpriteRendererBySlotName(SpriteRenderer[] cachedSpriteRenderers, string name)
    {
        for (int i = 0; i < cachedSpriteRenderers.Length; i++)
        {
            if (cachedSpriteRenderers[i].transform.parent.name == name)
            {
                return cachedSpriteRenderers[i];
            }
        }

        return null;
    }
}